/*
 * @(#)ComponentRoleMapper.java   09/09/17
 * 
 * Copyright (C) 2009 Ecole des Mines d'Ales
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * Contact: yulinz88@gmail.com
 *
 *
 *
 */



package fr.ema.arch3d.ADL.specification.componentRole;

import fr.ema.ThreeDADL.model.architecture.ComponentType;
import fr.ema.ThreeDADL.model.architecture.specification.ComponentRole;
import fr.ema.arch3d.ADL.specification.componentType.ComponentTypeMapper;

import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

import java.io.CharArrayWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

//~--- classes ----------------------------------------------------------------

/**
 * Class description
 *
 *
 * @version        1.0, 09/09/13
 * @author         Huaxi (Yulin) ZHANG
 */
public class ComponentRoleMapper extends DefaultHandler {

    // Buffer for collecting data from
    // the "characters" SAX event.

    /** Field description */
    private CharArrayWriter contents = new CharArrayWriter();

    /** Field description */
    private ComponentRole cr;

    // Parent...

    /** Field description */
    ContentHandler parent;

    // XML Parser

    /** Field description */
    XMLReader parser;

    /**
     * Constructs ...
     *
     *
     * @param parser
     * @param parent
     * @param cr
     */
    public ComponentRoleMapper(XMLReader parser, ContentHandler parent, ComponentRole cr) {
        this.parent = parent;
        this.parser = parser;
        parser.setContentHandler(this);
        this.cr = cr;
    }

    public void startElement(String namespaceURI, String localName, String qName, Attributes attr) throws SAXException {
        contents.reset();

        if (localName.equals("component-type")) {
            try {
                String file = attr.getValue("name");

                file = file.replace(".", "//");

                // System.out.println("here"+file);
                file = "src//main//java//example//componentTypes//" + file + ".xml";

                // String file="src//example//cd.xml";
                // Create SAX 2 parser...
                XMLReader xr = XMLReaderFactory.createXMLReader();

                cr.cmpType = new ComponentType();

                // Set the ContentHandler...
                ComponentTypeMapper ctMapper = new ComponentTypeMapper(xr, this, cr.cmpType);

                // xr.setContentHandler(defHandler);
                // Parse the file...
                xr.parse(new InputSource(new FileReader(file)));

                // System.out.println(defHandler.ct.name);
            } catch (FileNotFoundException e) {

                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {

                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    // Override methods of the DefaultHandler class
    // to gain notification of SAX Events.
    //
    // See org.xml.sax.ContentHandler for all available events.
    //
    public void endElement(String namespaceURI, String localName, String qName) throws SAXException {

        // System.out.println("componentMapper="+localName);

        /*
         * if ( localName.equals( "definition" ) ) {
         *       System.out.println("here");
         *
         *       // Create SAX 2 parser...
         *       XMLReader xr = XMLReaderFactory.createXMLReader();
         *
         *       // Set the ContentHandler...
         *       DefinitionHandler defHandler = new DefinitionHandler(xr);
         *       xr.setContentHandler(defHandler);
         *
         *       // Parse the file...
         *       xr.parse( new InputSource(
         *                       new FileReader(file)) );
         *
         * }
         */
        if (localName.equals("component-type")) {

            // swap content handler back to parent
            parser.setContentHandler(parent);
        }
    }

    public void characters(char[] ch, int start, int length) throws SAXException {

        // accumulate the contents into a buffer.
        contents.write(ch, start, length);
    }
}
